#!/usr/bin/env python3.11
# -*- encoding: utf-8 -*-
'''
@File    :   schema.py
@Time    :   2024/04/11 17:33:32
@Author  :   windstarry 
@Version :   1.0
'''
# here put the import lib
from django.db import transaction
from typing import Any
from ninja import Field
from ninja_schema import ModelSchema,Schema
from ninja_extra.exceptions import APIException
from .models import Student

class StudentSchema(ModelSchema):
    gender: int = Field(..., description="性别")
    class Config:
        model = Student
        include = ["sno", "name","birthday","mobile", "email", "address", "image"]
        
  
class CreateStudentSchema(ModelSchema):
    gender: int = Field(..., description="性别")
    class Config:
        model = Student
        include = ("sno", "name","birthday","mobile", "email", "address", "image")
        
    @transaction.atomic
    def create_obj(self, **kwargs: Any):
        """
        创建一个学生对象并将其保存到数据库中。

        该方法首先将当前对象转换为一个字典（不包含None值），然后将传入的关键字参数合并到这个字典中。
        最后，使用合并后的字典作为参数，创建一个学生对象并将其保存到数据库。

        参数:
        self -- 对象本身的引用。
        **kwargs: Any -- 任意关键字参数，这些参数将被添加到创建学生对象的字典中。

        返回值:
        返回成功创建并保存到数据库的学生对象。
        """
        # 将当前对象转换为字典，排除None值，然后更新传入的kwargs
        _data = self.dict(exclude_none=True)
        _data.update(kwargs)
        # 判断sno是否已经存在
        if not Student.objects.filter(sno=_data["sno"]).exists():
            # 使用更新后的字典创建并保存一个学生对象到数据库，返回创建的对象
            return Student.objects.create(**_data)
        return APIException("学号已存在")


class UpdateStudentSchema(ModelSchema):
    gender: int = Field(..., description="性别")
    class Config:
        model = Student
        include = ("name", "birthday","mobile", "email", "address", "image")
        
    def update(self, instance: Any, **kwargs: Any) -> Any:
        """
        Args:
            instance (Any): 对象实例。
            **kwargs (Any): 关键字参数。
        Returns:
            Any: 对象实例。
        Raises:
            Exception: 如果实例为空。
        Examples:
            >>> instance = SomeClass()
            >>> instance.update(name='John', age=25)
            >>> instance.save()
        """
        if not instance:
            raise Exception("需要传入实例")
        data = self.dict(exclude_none=True)
        data.update(kwargs)
        for attr, value in data.items():
            setattr(instance, attr, value)
        instance.save()
        return instance


class MessageSchema(Schema):
    code:int
    message: str  
